<?php

    global $mikron;
    $gameFormID = 2002;
    $gameID = 2;
    $game = new GAME($gameID);

    $gameform = new game_form($gameFormID);
    $FreeBieGame = new FreeBieGame();
    $gameform->addIntValue("gameid", true);
    $gameform->OpenGame(2, $FreeBieGame);

    class FreeBieGame
    {
        function Play()
        {
            
            global $mikron;

            // текущий активный кабинет
            $cabinet = $mikron->Site->auth->cabinet;
            $cabid = $cabinet->id;
            $ip = $_SERVER["REMOTE_ADDR"];
            $maskip = MaskIP($ip);
            $ip2 = quote_smart($ip);
            $maskip2 = quote_smart($maskip);
            $game = get_today_game($cabinet);

            // Фильтр даты
            $dt = time();
            $dtcond = "DAY(`dt`) = ".date("d", $dt)." AND MONTH(`dt`)=".date("m", $dt)." AND YEAR(`dt`)=".date("Y", $dt);

            // 1. Проверяем, была ли с этого аккаунта игра сегодня.
            if(is_object($game))
            {
                if($game->finish->value == 1)
                {
                    //todo: нужно вывести через сколько можно будет играть
                    ?>{{nicewindow style=error caption="Внимание"}}Вы уже получали сегодня бесплатный шанс.{{/nicewindow}}<?php
                    return endpage();
                }
                // Игра продолжается
                ContinueGame($game);
                return true;
            }

            // 2. Проверяем, была ли игра сегодня с этого IP
            $cond = "$dtcond AND `ip` = $ip2";
            $game2 = $mikron->Queries->Query("FREE_GAME_PLAYER", null, $cond);
            if($game2->count() > 0)
            {
                // Если была то сообщаем, что следующая игра будет доступна через ч.м.
                //todo: нужно вывести через сколько можно будет играть
                ?>{{nicewindow style=error caption="Внимание"}}С данного IP-адреса сегодня уже была игра.{{/nicewindow}}<?php
                return;
            }
            
            // 3. Ищем запись с IP игрока по первым 3-м октетам на текущий день
            $cond = $dtcond.' AND `ip` like '.$maskip2;
            $game3 = $mikron->Queries->Query('FREE_GAME_PLAYER', null, $cond);
            while($game = $game3->fetch())
            {
                $diff = MikronDateTime::DateDiff('s', strtotime($game->dt->value), time());
                $min_seconds = 1800;
                if($diff <= $min_seconds)
                {
                    // Если была то сообщаем, что следующая игра будет доступна через ч.м.
                    ?>{{nicewindow style=error caption="Внимание"}}
                    С Вашей подсети сегодня уже была игра.
                    Приходите через <?php echo ceil(($min_seconds-$diff)/60) ?> минут.
                    {{/nicewindow}}<?php
                    return;
                }
            }

            // 4. Проверяем IP на принадлежность к РФ. Если нет, то сообщаем об этом игроку
            $city = getCity($ip); // 'Казань';
            $ocity = addCityToBase($city);
            if(is_null($city))
            {
                ?>{{nicewindow style=error caption="Внимание"}}С данного IP-адреса игра запрещена.{{/nicewindow}}<?php
                return;
            }
            
            // Старт новой игры
            $game = new FREE_GAME_PLAYER();
            $game->ip->value = $ip;
            $game->city->value = $ocity->id;
            $game->stage->value = 0;
            $mikron->EntityManager->Save(Array($game), false);
            $cabinet->freegame->value = $game->id;
            $mikron->EntityManager->Save(Array($cabinet, $game));
            // Игра создана
            ContinueGame($game);
    
        }

    }

    function ContinueGame($game)
    {
        global $mikron;
        if($game->finish->value == 1)
        {
            return false;
        }
        $cabinet = $mikron->Site->auth->cabinet;
        $stages = $mikron->EntityManager->QueryCount('FREE_GAME_PAGE');
        // продолжение игры
        if(isset($_REQUEST['freegameform']))
        {
            if($game->stage->value+1 <= $stages)
            {
                $game->stage->value++;
                if($game->stage->value >= $stages)
                {
                    $game->finish->value = 1;
                }
            }
        }
        if($game->finish->value==1)
        {
            try
            {

                $sf = $mikron->Site->getSettings();
                $incode = 'bronze';
                $quantity = (int)$sf->freegamebronze->value;
                $foplog = ChangeCabinetBalance($cabinet, 11, 0, 0, 0, 0, $quantity);
                $foplog->$incode->value = $quantity;
                OperationLogEcp($foplog, $cabinet);
                $mikron->EntityManager->Save(Array($foplog, $cabinet, $game));
                ?><table><tr><td>{{nicewindow style=silver caption="Поздравляем!"}}
                Вы выиграли:
                    <blockquote>
                        Бронзовых шансов: <?php echo $quantity; ?>шт.
                    </blockquote>
                {{/nicewindow}}</td></tr></table>
                <?php
                return true;
            }
            catch(Exception $ex)
            {
                CriticalError('Ошибка в файле '.__FILE__.' в строке '.__LINE__.', '.$ex->getMessage(), null, true);
            }
        }
        $game->Save();
        $stage = (int)$game->stage->value;
        $stage1 = $stage + 1;
        echo "<font class='disabledtext'>Уровень №$stage1 из $stages</font>";
        $page = $mikron->Queries->Query("FREE_GAME_PAGE", null, null, "`mikron_order` asc", "$stage,1");
        if($page->count() > 0)
        {
            echo $page->fetch()->toString();
        }
        $frm = new html_form('freegameform', 'post', '/cabinet/games/freebie/?game=2');
            $frm->addSubmit('getfreesubmit', 'Далее');
        $frm->end();
        echo '&nbsp;';
        return;
    }

    /*
    В БД есть 2 вида записей IP адресов. В первой таблице хранятся полные IP, а во второй первые три октета в дополнение к которым стоит дата последней игры по этим 3-м октетам.

    1. Проверяем, была ли с этого аккаунта игра сегодня.
    Если была: Сообщаем, что следующая игра будет доступна через ч.м.
    Если не была: переходим к шагу 2

    2. Проверяем, была ли игра сегодня с этого IP по таб. 1. Если была то сообщаем, что следующая
     игра будет доступна через ч.м. Если не была, то шаг 3.

    3. Ищем в таблице два IP игрока по первым 3-м октетам если находим то
    смотрим когда была игра, если прошло 30 минут (настраивается) с момента последней игры то записываем новое время и переходим к шагу 4. Если не прошло, то сообщаем через сколько он сможет сыграть.

    4. Проверяем IP на принадлежность к РФ. Если нет, то сообщаем об этом игроку, если все нормально, то заносим в первую
     таблицу IP полностью, и во вторую первые три октета и время игры.

    5. Игра началась.

    Каждые новые сутки в 00.00 обе таблицы с записями очищаются.
    */

    
    /*

        ЭТАП 1. Основная (предварительная) проверка.
        1. если получал сегодня бонус тогда [известить что сл. раз можно играть только завтра (часов, минут, секунд)] + [выход из игры]
        2. определить ip адрес (далее адрес) и город
        3. если город не определен тогда [известить о невозможности играть с данного адреса] + [выход из игры]

        ЭТАП 2. Запуск игры.
        1. проверить наличие в БД записи с таким адресом на текущую дату
        2. если записи нет тогда проверим наличие в БД записи по 3-м октетам IP адреса
        3. если по 3-м октетам запись есть, тогда [известить что сл. раз можно играть только через опред. кол-во часов, минут, секунд]
        4. если по 3-м октетам записи нет, тогда [старт игры]

        ЭТАП 3. Продолжение игры.
        1. если есть запись с таким адресом, то [проверить кабинет]
        2. если [кабинет] не совпадает тогда [известить о том, что сл. раз можно играть только завтра (часов, минут, секунд)]

        ЭТАП 4. Игра.
        если шанс не получен то [вывести следующий непросмотренный баннер]

    */

    function addCityToBase($cityname)
    {
        global $mikron;
        try
        {
            $city = new CITY();
            $city->name->value = $cityname;
            $city->Save();
            return $city;
        }
        catch(Exception $ex)
        {
            $cityname2 = quote_smart($cityname);
            $cities = $mikron->Queries->Query('CITY', null, new Criterion('name', $cityname));
            if($cities->count() == 1)
            {
                return $cities->fetch();
            }
            // такой город уже есть в справочнике
        }
    }

    function get_today_game($cabinet)
    {
        if(is_null($game = $cabinet->freegame->value) || $game->isnew)
        {
            return null;
        }
        if(date('d.m.Y', strtotime($game->dt->value)) == date('d.m.Y'))
        {
            return $game;
        }
        return null;
    }

    function MaskIP($ip)
    {
        $ip_e = explode(".", $ip);
        $ip_e[3] = "%";
        return implode(".", $ip_e);
    }

?>